#ifndef RACE_H
#define RACE_H

#include <iostream>
#include <vector>
#include "lib.h"

#include <boost/assign/list_of.hpp>

using namespace std;

/**
 * La classe Race représente une race au sens AD&D. C'est une classe
 * abstraite, qui sert au polymorphisme.
 * @author Johan "Solo" Luisier
 */
class Race
{
 protected:
  /**
   * Capacités raciales
   */
  vector<unsigned int> capacites;
  /**
   * Niveau de sortie des fonctions globales
   * @see DebugLevelType
   * @see debugstream 
   */
  static DebugLevelType elementaire;
  /**
   * Niveau de sortie des fonctions plus spécifiques
   * @see DebugLevelType
   * @see debugstream 
   */
  static DebugLevelType fonction;
  /**
   * Nom de la Race (Elfe, Gnome, Humain, ...)
   */
  string Type;
  /**
   * Pointeur sur la liste des capacités raciales
   */
  const vector< ListCapa > *ptrCapa;
  /**
   * Pointeur sur les ensembles raciaux
   */
  const vector< vector< unsigned int > > *ptrEns;
  /**
   * Pointeur sur le nombre de capcités raciales de la Classe
   */
  const unsigned int *ptrNbrCapa;
  /**
   * Pointeur sur le nombre d'ensembles raciaux
   */
  const unsigned int *ptrNbrEns;
  /**
   * Pointeur sur le nombre max de capacités dans un ensemble racial
   */
  const unsigned int *ptrMaxEns;
 public:
  Race(const string& type);
  Race(const Race& race);
  virtual ~Race();
  virtual void appliquer_ajustements(unsigned int tab[6]);
  void affiche_info(ostream& os = blank()) const;
  string get_Type() const;
  unsigned int get_taille() const;
  unsigned int get_capa(const unsigned int& i) const;
  string get_capacite(const unsigned int& i) const;
  void get_capacites(unsigned int& nbr, vector<ListCapa>& capa) const;
  void get_ensemble_racial(unsigned int& nbr, unsigned int& max) const;
  const vector<unsigned int>* get_ensemble_racial(const unsigned int& nbr) const;
  unsigned int get_PP() const;
  void set_capacites(const vector<unsigned int>& capa);
  static void setLevel(const DebugLevelType& level, const unsigned int& n);
  void get_toutes_capacites(vector<unsigned int>& vec) const;
};


#endif
